//
//  dataType.swift
//  Study-code
//
//  Created by quanhao huang on 2021/11/12.
//

import Foundation

/**
 swift小知识
 1.(let, var) let为常量定义后无法改变，var为变量定义后可以修改它的值
 2.(_ = xxx)在swift中，任何一个 = 前边的内容被new出来，都是需要被使用的，如果不想使用，请用_ = 告诉编译器不需要使用它
 3.(class xxx: ???) 这是类的定义class代表他是一个类，xxx是类的名字，而：后边则代表了它属于什么类
 4.(func name() -> return) 这是方法的定义，name是方法的名字，return则是需要这个方法返回什么内容，（如果它返回的是空，那可以不写-> return，也可以写成-> Void,因为在swift中Void代表不返回)。在swift中，方法并不需要写到一个类里边，但是如果它写到了这个类里边，那么它就是属于这个类的，相反如果写在了外边，那就是属于全局方法，它属于所有人，
 */

//常用的数据类型
class dataType: NSObject {
    //初始化常用数据类型
    let a:Int = 5//:后边告诉编译器a是一个int的整型数据
    let b:Float = 5.0//:后边告诉编译器b是一个float的浮点数据
    let c = 6.0//虽然未指定类型，但是编译器会判断c为浮点数据，这种写法虽然省时，但是并不完美c++里不适用
    
    //转化类型（将某一个类型进行转为另一个类型，oc虽支持隐式转化，但是swift并不支持） 隐式转化为编译器自动帮你转移，显示转化为自己指定，下边示例显式转化
    func modifiedDataType() {
        _ = Float(a)//将a转为了浮点，赋予一个新的值，但是a本身不改变
        _ = Int(b)//将b转为了整型，由于整型没有小数点，所以0.4的精度就被丢弃了，这种情况要慎重考虑，因为精度不准确了
    }
    //没有返回值方法的另一种写法
    func modifiedDataType2() -> Void {}
    //带返回值的写法,我们做了一个加法方法，将a和b相加，因为b是float，相加结果总为float，但是我们的返回值是Int，所以就需要做强制转化为Int了
    func modifiedDataType3() -> Int {
        return a + Int(b)
    }
    //带传参的方法写法，我们做一个方法，能让你传入2个数字来做相加，这个就是一个简单的计算器方法了,不同的参数用,隔开
    func addition(value:Int, value2: Int) -> Int {
        return value + value2
    }
    //简化的带传参的方法写法,我们在参数前边加上了_,告诉编译器，不需要提醒我们类型了，这是一个简化写法，但是代价就是复杂的方法没有参数提醒很容易导致别的同事开发出错
    func addition2(_ value:Int,_ value2: Int) -> Int {
        return value + value2
    }
    //如何使用一个方法呢，像下边这样
    func useMethod() {
        _ = modifiedDataType3()
        _ = addition(value: 4, value2: 5)//改改看返回了一个什么值吧
        _ = addition2(4, 5)//简化板就没有上边的value提醒啦
    }
}

//常用的数据结构
class dataStructure: NSObject {
    //数组
    let a:Array<String> = []//这就是一个不可变的空数组了,Array代表了swift里的数组<string>代表了里边的元素是字符串类型
    let b:Array = ["1", "2"]//当然了我们依旧可以很简化的去写,因为""代表了字符串，所以这个数组自动就被认为是字符串类型的数组了
    var c = ["3", "4"]//这里建了一个可变数组，用到了关键字var
    //数组的操作,我们不需要返回值，所以-> Void，当然简化版也可以不写
    func opArray() -> Void {
        //这里我们取数组b的第二个元素也就是“2”，为什么是1呢，因为数组的下标是从0开始的，但是如果我们写2呢？由于数组只有2个元素，所以下标2是不存在的，这个时候程序就会崩溃，因为这叫数组越界，这种是新手很常见的崩溃问题，一定要注意
        //let d = b[1]
        
        //数组添加元素，删除元素,注意只有var的可变数组才可以进行操作）
        //添加元素
        c.append("3")
        //删除指定下标的元素
        c.remove(at: 0)
        //删除所有元素
        c.removeAll()
        //这个时候c就是一个空数组了
    }
    //字典
    let d:Dictionary<String, String> = [:]//这就是一个不可变的字典了,Dictionary代表了swift里的数组<string，string>代表了key跟value对应的类型，一般来讲我们都用了字符串，但是特殊情况也会有不同
    let e:Dictionary = ["fruit": "apple", "animal": "monkey"]//我们new了一个字典，key分别为水果和动物，value分别为苹果和猴子，因为用了字符串，所以这个字典自动就被认为key和value都是字符串了
    var f = ["fruit": "apple", "animal": "monkey"]//这里建了一个可变字典，用到了关键字var
    //字典的操作,我们不需要返回值，所以-> Void，当然简化版也可以不写
    func opDictionary() {
        //查询字典是否有这个key,返回结果是个bool类型的，bool就是true，或者false，也可以说1，或者0，
        let bool = f.keys.contains("fruit")//我们查询这个字典是不是含有这个key，这个方法会返回一个bool值，用它来判断是不是含有这个key
        //常用的判断写法
        if bool {
            //它是真的有
            print("字典里有fruit这个key")
        }else {
            //它没有
            print("字典里没有fruit这个key")
        }
        //高级写法，三目运算符,等同与上边的代码。三目运算符写法 (判断条件) ? (为真) : (为假)
//        bool ? print("字典里有fruit这个key") : print("字典里没有fruit这个key")
    }
}

//枚举(一般是用来列举多种可能性的选项)
enum loginTypes {
    case email
    case phone
    case accout
}
